package com.ms.demo;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @description: cglib动态代理
 * @author: ms
 * @create: 2022-08-29 15:12
 */
public class CalculateCglibProxy implements MethodInterceptor {

    //目标对象
    private Object target;

    //通过构造器传入目标对象
    public CalculateCglibProxy(Object target) {
        this.target = target;
    }

    //创建一个代理对象
    public Object getProxy() {
        //可以通过Enhancer对象中的create()方法可以去生成一个类，用于生成代理对象
        Enhancer enhancer = new Enhancer();
        //设置父类(将目标类作为代理类的父类)
        enhancer.setSuperclass(target.getClass());
        //设置拦截器(回调对象为本身对象)
        enhancer.setCallback(this);
        //生成一个代理类对象并返回给调用着
        return enhancer.create();
    }


    /**
    * @Param: [o, method, objects, methodProxy]  [动态生成的代理类的实例，被代理对象方法，方法入参，代理方法]
    */
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("目标方法执行前执行，[方法名为: "+ method.getName() +"] ; [参数为: " + Arrays.toString(objects)+"]");
        Object object = methodProxy.invokeSuper(o, objects);
        System.out.println("目标方法执行后执行，执行后的结果为: " + object.toString());
        return object;
    }
}